package fmppc.basics;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import fdupc.entity.IEntityClass;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.Date;

/**
 * 类描述:  基础实体对象
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2022/2/24 0024 上午 9:20
 */
@Data
@Slf4j
@Accessors(chain = true)
@SuppressWarnings("unchecked")
public class BasicsEntity<T> implements IEntityClass {
    private static final long serialVersionUID = 2563955190801018513L;
    /**
     * 属性描述：创建时间
     *
     * @date : 2022/2/24 0024 上午 9:21
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;
    /**
     * 属性描述：最后更新时间
     *
     * @date : 2022/2/24 0024 上午 9:21
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 深度拷贝(存在转换风险)
     *
     * @return 克隆的结果对象
     * @throws IOException            异常
     * @throws ClassNotFoundException 异常
     * @author 王雷    (2018年1月9日 上午11:33:23)
     */
    public T deepClone() throws IOException, ClassNotFoundException {
        // 将对象写到流里
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        ObjectOutputStream oo = new ObjectOutputStream(bo);
        oo.writeObject(this);
        // 从流里读出来
        ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream oi = new ObjectInputStream(bi);
        return (T) oi.readObject();
    }

    /**
     * 功能描述：实体数据是否有效
     *
     * @param verificatType 验证类型
     * @return 验证结果；True：验证成功；False：验证失败
     * @date : 2023/2/8 0008 下午 10:39
     */
    public boolean verification(int verificatType) {
        return true;
    }

    /**
     * 功能描述：数据属性赋值
     *
     * @param dataEntity 数据原实体对象
     * @param putType    属性赋值类型
     * @return 处理后的对象
     * @throws Exception 异常
     * @date : 2023/2/8 0008 下午 10:59
     */
    public T putAttribute(T dataEntity, int putType) throws Exception {
        return null;
    }

    /**
     * 功能描述：数据属性赋值
     *
     * @param dataEntity 数据原实体对象
     * @return 处理后的对象
     * @throws Exception 异常
     * @date : 2023/2/8 0008 下午 10:59
     */
    public T putAttribute(T dataEntity) throws Exception {
        return putAttribute(dataEntity, 0);
    }

    /**
     * 功能描述：初始化属性
     *
     * @param type 类型；在多状态的情况下内部根据传入的参数进行状态属性的切换处理工作
     * @return 处理后的对象
     * @date : 2023/2/8 0008 下午 11:02
     */
    public T initAttribute(int type) {
        return null;
    }

    /**
     * 功能描述：状态切换
     *
     * @param type 类型；在多状态的情况下内部根据传入的参数进行状态属性的切换处理工作
     * @date : 2023/2/8 0008 下午 10:34
     */
    public T switchoverStatus(int type) {
        return null;
    }
}
